package Chapter8;
//164页程序8.5
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class TwoStatesButtonDemo2 {
    JFrame frame = new JFrame("多种按钮测试程序"); //定义框架
    JCheckBox cb1 = new JCheckBox("复选按钮1"); //定义复选按钮
    JCheckBox cb2 = new JCheckBox("复选按钮2");
    JCheckBox cb3 = new JCheckBox("复选按钮3");
    JCheckBox cb4 = new JCheckBox("复选按钮4");
    JCheckBox cb5 = new JCheckBox("复选按钮5");
    JCheckBox cb6 = new JCheckBox("复选按钮6");
    JRadioButton rb1 = new JRadioButton("单选按钮1"); //定义单选按钮
    JRadioButton rb2 = new JRadioButton("单选按钮2");
    JRadioButton rb3 = new JRadioButton("单选按钮3");
    JRadioButton rb4 = new JRadioButton("单选按钮4");
    JRadioButton rb5 = new JRadioButton("单选按钮5");
    JRadioButton rb6 = new JRadioButton("单选按钮6");
    JTextArea ta = new JTextArea(); //显示多行文本的对象

    public static void main(String[] args) {
        TwoStatesButtonDemo2 ts = new TwoStatesButtonDemo2();
        ts.go(); //创建ts对象前会调用go方法来创建ts，创建完成在访问go
    }

    public void go() {
        JPanel p1 = new JPanel(); //创建面板，默认FlowLayout布局
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();
        JPanel p4 = new JPanel();
        JPanel p5 = new JPanel();
        JPanel pa = new JPanel();
        JPanel pb = new JPanel();
        p1.add(cb1); //将3个复选按钮添加到面板1，FlowLayout布局是每行从左向右
        p1.add(cb2);
        p1.add(cb3);
        Border etched = BorderFactory.createEtchedBorder(); //产生Border对象，浮雕凹效果的边缘框
        Border border = BorderFactory.createTitledBorder(etched, "复选按钮"); //通过原有的Border对象，带标题
        p1.setBorder(border); //给面板1设置浮雕凹效果的边缘框
        p2.add(cb4); //将3个复选按钮添加到面板2
        p2.add(cb5);
        p2.add(cb6);
        border = BorderFactory.createTitledBorder(etched, "复选按钮组"); //通过原有的Border对象，带标题
        p2.setBorder(border);
        ButtonGroup group1 = new ButtonGroup(); //按钮组，将按钮组成一组，它们的关系变成联动状态，从逻辑上实现，实际不可见
        group1.add(cb4); //将3个复选按钮添加到按钮组
        group1.add(cb5);
        group1.add(cb6);
        p3.add(rb1); //将3个单选按钮添加到面板3
        p3.add(rb2);
        p3.add(rb3);
        border = BorderFactory.createTitledBorder(etched, "单选按钮"); //为原有的Border对象加上标题
        p3.setBorder(border); //将效果设置到面板3
        p4.add(rb4); //将3个单选按钮添加到面板4
        p4.add(rb5);
        p4.add(rb6);
        border = BorderFactory.createTitledBorder(etched, "单选按钮组"); //为原有的Border对象加上标题
        p4.setBorder(border); //将效果设置到面板4
        ButtonGroup group2 = new ButtonGroup(); //创建按钮组
        group2.add(rb4); //将3个单选按钮绑定为1个按钮组
        group2.add(rb5);
        group2.add(rb6);
        JScrollPane jp = new JScrollPane(ta); //带滚动条的面板内加入显示多行文本的对象ta
        p5.setLayout(new BorderLayout()); //为面板5设置BorderLayout布局
        p5.add(jp); //为面板5加入带滚动条的面板
        border = BorderFactory.createTitledBorder(etched, "结果"); //为原有的Border对象加上标题
        p5.setBorder(border); //为p5面板添加浮雕凹效果和标题
        ItemListener il = new ItemListener() { //为ItemListener接口实现抽象方法，然后创建实例化对象il ItemListener是多个可选项（复选框，列表框等）的监听程序的接口
            @Override
            public void itemStateChanged(ItemEvent e) { //实现了监听程序的接口 系统创建了事件对象ItemEvent e
                JCheckBox cb = (JCheckBox) e.getSource(); //获得事件源，默认返回Object，因此要强制转换赋值给复选框对象cb，cb是一个引用，6个复选按钮哪个发生引用哪个
                if (cb == cb1) { //如果事件源是cb1按钮，则cb引用cb1，即取得事件源
                    ta.append("\n 选中复选按钮1：" + cb1.isSelected()); //如果事件源是该项，则向ta面板添加括号中的内容，isSelected表示是否被选中，true为选中
                } else if (cb == cb2) {
                    ta.append("\n 选中复选按钮2：" + cb2.isSelected());
                } else if (cb == cb3) {
                    ta.append("\n 选中复选按钮3：" + cb3.isSelected());
                } else if (cb == cb4) {
                    ta.append("\n 选中复选按钮4：" + cb4.isSelected());
                } else if (cb == cb5) {
                    ta.append("\n 选中复选按钮5：" + cb5.isSelected());
                } else {
                    ta.append("\n 选中复选按钮6：" + cb6.isSelected());
                }
            }
        };
        cb1.addItemListener(il); //为6个按钮都添加多个可选项（复选框，列表框等）的监听程序
        cb2.addItemListener(il);
        cb3.addItemListener(il);
        cb4.addItemListener(il);
        cb5.addItemListener(il);
        cb6.addItemListener(il);
        ActionListener al = new ActionListener() { //以下部分同上，为单击按钮做相同操作
            @Override
            public void actionPerformed(ActionEvent e) {
                JRadioButton rb = (JRadioButton) e.getSource();
                if (rb == rb1) {
                    ta.append("\n 选中单选按钮1：" + rb1.isSelected());
                } else if (rb == rb2) {
                    ta.append("\n 选中单选按钮2：" + rb2.isSelected());
                } else if (rb == rb3) {
                    ta.append("\n 选中单选按钮3：" + rb3.isSelected());
                } else if (rb == rb4) {
                    ta.append("\n 选中单选按钮4：" + rb4.isSelected());
                } else if (rb == rb5) {
                    ta.append("\n 选中单选按钮5：" + rb5.isSelected());
                } else {
                    ta.append("\n 选中单选按钮6：" + rb6.isSelected());
                }
            }
        };
        rb1.addActionListener(al);
        rb2.addActionListener(al);
        rb3.addActionListener(al);
        rb4.addActionListener(al);
        rb5.addActionListener(al);
        rb6.addActionListener(al);
        pa.setLayout(new GridLayout(0, 1)); //为面板pa设置GridLayout布局 网格布局 设置0行表示行数不定 1列
        pa.add(p1); //将面板按竖直方向添加到面板pa中
        pa.add(p2);
        pb.setLayout(new GridLayout(0, 1));
        pb.add(p3);
        pb.add(p4);
        Container cp = frame.getContentPane(); //获取内容窗格用cp来引用
        cp.setLayout(new GridLayout(0, 1));
        cp.add(pa);
        cp.add(pb);
        cp.add(p5); //带滚动条的面板
        frame.pack(); //自适应框架
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
//当多个按钮被添加组后，则它们的状态将会与原来不同，有一个按钮被选中，则组里其他的按钮会恢复未选中
//若多个按钮不在一个组中，则选中的状态互不影响
//ItemLister和ActionLister在按钮组中显示是有差别的，前者监听程序若切换按钮会将源选中的按钮显示false，只显示切换后按钮为true；而后者监听程序只显示切换后按钮为true
//具体程序说明页167下方